import axios from 'axios'
import store from '@/store'
import router from '@/router'
const request = axios.create({
  baseURL: 'http://edufront.lagou.com'
})

function redirectLogin () {
  return router.push({
    name: 'login',
    query: {
      redirect: router.currentRoute.fullPath
    }
  })
}

// 请求拦截
request.interceptors.request.use(config => {
  const { user } = store.state
  // 检测是否存在用户信息，设置认证请求header
  if (user && user.access_token) {
    config.headers.Authorization = user.access_token
  }
  return config
})
// 刷新标识
let isRefreshing = false
// 请求存储数组
let requests = []

// 响应拦截
request.interceptors.response.use(
  response => {
    return response
  },
  async error => {
    if (error.response) {
      // 1, 判断 401 未认证错误
      if (error.response.status === 401) {
        // 2，判断是否有用户信息，有则刷新token
        if (!store.state.user) {
          // 8，增加无用户信息和刷新失败后跳转登录（使用router.cuurentRoute 获取当前路由信息）
          redirectLogin()
          return Promise.reject(error)
        }
        // 检测到正在刷新
        if (isRefreshing) {
          // 7，因刷新导致失败的请求需要存储下来，刷新成功后发送失败的请求
          return requests.push(() => {
            request(error.config)
          })
        }
        // 6，刷新期间 使用刷新标识，避免重复刷新请求
        isRefreshing = true
        // 3，刷新 token 后判断刷新请求是否成功
        const { data } = await request({
          method: 'POST',
          url: '/front/user/refresh_token',
          data: new window.URLSearchParams({
            refreshtoken: store.state.user.refresh_token
          }).toString()
        })
        // 5，失败， 清除存储的用户信息
        if (data.state !== 1) {
          store.commit('setUser', null)
          redirectLogin()
          return Promise.reject(error)
        }
        // 4，成功，存储刷新后的用户信息
        store.commit('setUser', data.content)
        isRefreshing = false

        // 发送请求失败存储数组的请求
        requests.forEach(fn => fn())
        // 置空
        requests = []
        // 发送本次失败的请求
        return request(error.config)
      }
      return Promise.reject(error)
    }
  }
)
export default request
